<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 面向对象的三大特征之封装

    function Cat(name, color) {
        // {}
        // {}[[Prototype]] = Cat.prototype;
        // this -> {}

        //  // 我们要做的操作: 在构造函数执行过程中 将属性和方法绑定到创建的实例化对象上
        this.name = name;
        this.color = color;

        // return this; 默认
    }



    console.dir(Cat); // 打印对象的属性和方法
    // console.log(Cat.prototype); // {constructor: Cat}

    // constructor 构造器属性
    // 1. 默认存储在构造函数的原型对象上,指向构造函数本身 => 给实例化对象使用
    // 2. 允许所有的实例化对象 通过此属性找到创建它的 构造函数

    // console.log(Cat.prototype.constructor === Cat);


    // 实例化对象访问属性和方法的机制:
    // 1. 实例化对象自己有先找自己的
    // 2. 自己没有 => 则找构造函数的原型对象(Cat.prototype)

    var Tom = new Cat("Tom", "black");
    console.log(Tom);
    console.log(Tom.constructor === Cat);  // Tom是由构造函数Cat创建的

    var Kitty = new Cat("Kitty", "pink");
    console.log(Kitty);
    console.log(Kitty.constructor === Cat); // Kitty是由构造函数Cat创建的

</script>

</html>